package transformations;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import org.jdom2.*;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

public class ICSXMLTransformation {

    BufferedReader fichierICS;
    Vector<Vector<String>> donnees;
    Vector<String> metaData;
    Element racine=new Element("emploisdutemps");
    Document document;
    
    
    public ICSXMLTransformation(String path){
        document=new Document(racine);
        document.setDocType(new DocType("emploisdutemps", "C:\\Users\\Ryadh\\Documents\\NetBeansProjects\\ProjetXML\\ICalDTD.dtd"));
        
        fichierICS=chargementFichierICS(path);
        donnees=chargementDonneesICS();
        construireFichierXML();
        
    }
    public BufferedReader chargementFichierICS(String path) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(path)));
            return br;
        } catch (FileNotFoundException ex) {
            System.out.println("le fichier " + path + " est introuvable");
        }
        return null;
    }

    /**
     * Cette méthode permet de charger les données du fichier ICS.
     *
     * @return les données retournées sont de type vecteur de vecteur de type
     * String, ces données sont ordonnées par évènnements
     *
     * BEGIN:VEVENT 
     * DTSTAMP:20130915T221607Z 
     * DTSTART:20131017T120000Z
     * DTEND:20131017T160000Z 
     * SUMMARY:JOB DATING 
     * LOCATION: 
     * DESCRIPTION:\nMaster 1 Info\n(Exported :16/09/2013 00:16)
     * LAST-MODIFIED:20130915T221607Z
     * SEQUENCE:13259967
     * END:VEVENT
     */
    public Vector<Vector<String>> chargementDonneesICS() {
        Vector<Vector<String>> data = new Vector<Vector<String>>();

        try {
            String ligne = fichierICS.readLine();
            Vector<String> partialData = new Vector<String>();
            
            while (ligne != null) {
                
                //System.out.println("ligne: "+ligne);
                String[] partie = ligne.split(":");
                
                
                //System.out.println("partie[0]: "+partie[0]);
                switch (partie[0]) {
                    case "BEGIN":
                        if (partie[1].equalsIgnoreCase("VCALENDAR"));
                        else partialData.addElement(partie[1]);
                        break;
                    case "DTSTAMP":
                        partialData.addElement(partie[1]);
                        break;
                    case "DTSTART":
                        partialData.addElement(partie[1]);
                        break;
                    case "DTEND":
                        partialData.addElement(partie[1]);
                        break;
                    case "SUMMARY":
                        partialData.addElement(partie[1]);
                        break;
                    case "LOCATION":
                        if(partie.length!=1)partialData.add(partie[1]);
                        else partialData.addElement("");
                        break;
                    case "DESCRIPTION":
                        partialData.addElement(partie[1]);
                        break;
                    case "LAST-MODIFIED":
                        partialData.addElement(partie[1]);
                        //System.out.println("partialData: "+partialData);
                        break;
                    case "END":
                        if(partie[1].equalsIgnoreCase("VCALENDAR"))return data;
                        data.addElement((Vector <String>) partialData.clone());
                        //System.out.println("partialData: "+partialData);
                        partialData.clear();
                        break;
                }
                ligne=fichierICS.readLine();
            }


        } catch (IOException ex) {
            Logger.getLogger(ICSXMLTransformation.class.getName()).log(Level.SEVERE, null, ex);
        }
        return data;
    }
    
    public Element getFatherNode(Document document,String node){
        List<Content> liste=document.getContent();
        int i=0;
        for(i=0;i<liste.size() && !liste.contains(node);i++);
        if(i<liste.size())return (Element)liste.get(i);
        else return new Element(node);
    }
    
    public String [] splitPerso(String s){
        Vector<String> result=new Vector<>();
        String tmp="";
        for(int i=0;i<s.length()-1;i++){
        if(s.charAt(i)=='\\' && s.charAt(i+1)=='n'){
            if(!tmp.equalsIgnoreCase("")){
                //tmp=tmp.replaceAll(" ", "_");
                result.add(tmp);
            }
            tmp="";
            i++;
        }
        else tmp+=s.charAt(i);
    }
        result.add(tmp);
        String [] finalResult=new String[result.size()];
        for(int i=0;i<finalResult.length;i++)
            finalResult[i]=result.elementAt(i).toString();
        
        return finalResult;
    }
    
    public void construireFichierXML(){
        for(int i=0;i<donnees.size();i++){//ici nous somme en VEVENT donc un cours
            Element cours=new Element("cours");
            racine.addContent(cours);
        for(int j=0;j<donnees.elementAt(i).size();j++){
            //cours.addContent(new Element(donnees.elementAt(i).elementAt(j)));
                    Element jour=new Element("jour");
                    Element mois=new Element("mois");
                    Element annee=new Element("annee");
                    Element heure=new Element("heure");
                    Element minute=new Element("minute");
                    Element seconde=new Element("seconde");
                    //Element seconde2=new Element("seconde2");
                    String content;
            switch(j){
                //date start
                case 2:Element datedebut=new Element("datedebut");
                                        
                    content=donnees.elementAt(i).elementAt(j).toString();
                    annee.setText(content.substring(0, 4));
                    mois.setText(content.substring(4, 6));
                    jour.setText(content.substring(6, 8));
                    heure.setText(content.substring(9, 11));
                    minute.setText(content.substring(11, 13));
                    seconde.setText(content.substring(13, 15));
                    //seconde2.setText("blabla");
                    datedebut.addContent(annee);
                    datedebut.addContent(mois);
                    datedebut.addContent(jour);
                    datedebut.addContent(heure);
                    datedebut.addContent(minute);
                    datedebut.addContent(seconde);
                    //datedebut.addContent(seconde2);
                    cours.addContent(datedebut);
                    break;
                // date end
                case 3:
                    Element datefin=new Element("datefin");               
                    content=donnees.elementAt(i).elementAt(j).toString();
                    annee.setText(content.substring(0, 4));
                    mois.setText(content.substring(4, 6));
                    jour.setText(content.substring(6, 8));
                    heure.setText(content.substring(9, 11));
                    minute.setText(content.substring(11, 13));
                    seconde.setText(content.substring(13, 15));
                    
                    
                    
                    datefin.addContent(annee);
                    datefin.addContent(mois);
                    datefin.addContent(jour);
                    datefin.addContent(heure);
                    datefin.addContent(minute);
                    datefin.addContent(seconde);
                    
                    cours.addContent(datefin);
                    break;
                //intitulé du cours    
                case 4:
                    Element resume=new Element("resume");
                    resume.setText(donnees.elementAt(i).elementAt(j));
                    cours.addContent(resume);
                    break;
                case 5:
                    Element location=new Element("location");
                    location.setText(donnees.elementAt(i).elementAt(j));
                    cours.addContent(location);
                    break;
                case 6:
                    Element description=new Element("description");
                    /*content=donnees.elementAt(i).elementAt(j);
                    String tmp[]=content.split("\\".concat("n"));
                    cours.setAttribute(new Attribute("parcours", tmp[0]));
                    if(tmp.length>1)cours.setAttribute(new Attribute("enseignant", tmp[1]));*/
                    String [] infos=splitPerso(donnees.elementAt(i).elementAt(j));
            if(infos.length>2){
                int k=0;
                cours.setAttribute("enseignant", infos[infos.length-2]);
                /*for(k=0;k<infos.length;k++){
                //System.out.println(infos[k]);
            }*/
            for(k=0;k<infos.length-2;k++){
                Element parcours=new Element("parcours");
                parcours.setText(infos[k]);
                cours.addContent(parcours);
            }
            }
            else{
                Element parcours=new Element("parcours");
                parcours.setText(infos[0]);
                cours.addContent(parcours);
            }
            
                    //description.setText(donnees.elementAt(i).elementAt(j));
                    //cours.addContent(description);
                    break;
                case 7:
                    Element dernieremodification=new Element("dernieremodification");
                    content=donnees.elementAt(i).elementAt(j);
                    annee.setText(content.substring(0, 4));
                    mois.setText(content.substring(4, 6));
                    jour.setText(content.substring(6, 8));
                    heure.setText(content.substring(9, 11));
                    minute.setText(content.substring(11, 13));
                    seconde.setText(content.substring(13, 15));     
                    
                    dernieremodification.addContent(annee);
                    dernieremodification.addContent(mois);
                    dernieremodification.addContent(jour);
                    dernieremodification.addContent(heure);
                    dernieremodification.addContent(minute);
                    dernieremodification.addContent(seconde);
                    cours.addContent(dernieremodification);
                    break;
            }
        }
        }
        //afficherFichierXML();
        enregistrerXML("global.xml");
    }
    
    public void afficherFichierXML(){
        try{
            XMLOutputter output=new XMLOutputter();
            output.output(document, System.out);
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    
    public void enregistrerXML(String path){
        try{
            Format format=Format.getPrettyFormat();
            format.setEncoding("ISO-8859-1");
            XMLOutputter output=new XMLOutputter(format);
            
            output.output(document, new FileOutputStream(path));
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] a){
        ICSXMLTransformation trans=new ICSXMLTransformation("ADECal.ics");
        
    }
}
